package cn.iocoder.an.framework.common.util.business;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class CreateRepairNo {
    public static final String PREFIX = "WX"; // 固定前缀
    public static final int NUMBER_LENGTH = 4;  // 数字部分长度

    /**
     * 根据传入的编号生成下一个编号
     *
     * @param currentCode 当前编号（如 WX2025030009），如果为空则生成今天的初始编号
     * @return 下一个编号（如 WX2025030010 或 WX2025030001）
     */
    public static String generateNextCode(String currentCode) {
        if (currentCode == null || currentCode.isEmpty()) {
            // 如果编号为空，生成今天的初始编号
            return generateInitialCode();
        }

        // 验证编号格式是否正确
        if (!currentCode.startsWith(PREFIX)) {
            throw new IllegalArgumentException("编号格式不正确，必须以 " + PREFIX + " 开头");
        }

        // 获取年月部分
        String yearMonth = currentCode.substring(PREFIX.length(), PREFIX.length() + 6);

        // 验证年月是否为有效日期格式
        try {
            LocalDate.parse(yearMonth + "01", DateTimeFormatter.ofPattern("yyyyMMdd"));
        } catch (Exception e) {
            throw new IllegalArgumentException("编号中的年月部分无效");
        }

        // 提取数字部分
        String numberPart = currentCode.substring(PREFIX.length() + 6);

        // 将数字部分转换为整数并加一
        int nextNumber = Integer.parseInt(numberPart) + 1;

        // 格式化新的编号（数字部分补零到指定长度）
        String formattedNumber = String.format("%0" + NUMBER_LENGTH + "d", nextNumber);

        // 拼接新的编号
        return PREFIX + yearMonth + formattedNumber;
    }

    /**
     * 生成今天的初始编号
     *
     * @return 初始编号（如 WX2025030001）
     */
    private static String generateInitialCode() {
        // 获取当前年月
        String yearMonth = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMM"));

        // 初始数字部分为 1
        String formattedNumber = String.format("%0" + NUMBER_LENGTH + "d", 1);

        // 拼接初始编号
        return PREFIX + yearMonth + formattedNumber;
    }

}
